package com.palmcity.rtti.base;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.palmcity.rtti.base.PassingRoad.PassingRoadComparator;


/**
 * <p>EventLocation</p>
 * <p>DTI事件位置信息类</p>
 *
 * @author		周华彬(zhouhuabin@ctfo.com, zhou_hua_bin@163.com)
 * @version		0.0.0
 * <table style="border:1px solid gray;">
 * <tr>
 * <th width="100px">版本号</th><th width="100px">动作</th><th width="100px">修改人</th><th width="100px">修改时间</th>
 * </tr>
 * <!-- 以 Table 方式书写修改历史 -->
 * <tr>
 * <td>0.0.0</td><td>创建类</td><td>zhouhuabin</td><td>2014年12月30日 下午3:54:37</td>
 * </tr>
 * <tr>
 * <td>XXX</td><td>XXX</td><td>XXX</td><td>XXX</td>
 * </tr>
 * </table>
*/
public class EventLocation implements Serializable {

	/** TODO */
	private static final long serialVersionUID = -3614223323514130962L;

	/**
	 * 事件影响的路链数
	 * 包括起始路链、终止路链和途径路链
	 */
	private int affectLinks;
	
	/**
	 * 距离单位 
	 * 0:10m 1:100m 3:1km
	 */
	private int unit;
	
	/**
	 * 事件影响的总长度
	 * 从事件在起始路链的起点位置到终止路链的终点位置的距离
	 */
	private int totalDistance;
	/** 开始路链 */
	private DTILink startLink;
	/** 开始路链名称 */
	private String startName;
	
	/**
	 * 到开始路链终点的距离
	 * 从事件开始位置到开始路链终点的距离.指定距离范围 0km - 125km, 指定值为 126 时表示整条路链，
	 * 指定值 127 表示无指定。
	 */
	private int startDistance;
	/** 终止路链 */
	private DTILink endLink;
	/** 终止道路名称 */
	private String endName;
	
	/**
	 * 到终止路链终点的距离
	 * 从事件开始位置到终止路链终点的距离
	 */
	private int endDistance;
	
	/** 位置：经度，单位 1/1000,000度 */
	private int lon;
	/** 位置：纬度，单位 1/1000,000度 */
	private int lat;
	
	/**事件途径路链 */
	private final List<PassingRoad> passRoadList = new LinkedList<PassingRoad>();

	/**
	 * 构造器 
	 */
	public EventLocation() {
		startName = "";
		endName = "";

	}

	

	/**
	 * 字段 affectLinks 获取函数
	 * @return the affectLinks : int
	 */
	public int getAffectLinks() {
		return affectLinks;
	}



	/**
	 * 字段 affectLinks 设置函数 : int
	 * @param affectLinks the affectLinks to set
	 */
	public void setAffectLinks(int affectLinks) {
		this.affectLinks = affectLinks;
	}



	/**
	 * 字段 unit 获取函数
	 * @return the unit : int
	 */
	public int getUnit() {
		return unit;
	}



	/**
	 * 字段 unit 设置函数 : int
	 * @param unit the unit to set
	 */
	public void setUnit(int unit) {
		this.unit = unit;
	}

	/**
	 * 字段 totalDistance 获取函数
	 * @return the totalDistance : int
	 */
	public int getTotalDistance() {
		return totalDistance;
	}

	/**
	 * 字段 totalDistance 设置函数 : int
	 * @param totalDistance the totalDistance to set
	 */
	public void setTotalDistance(int totalDistance) {
		this.totalDistance = totalDistance;
	}

	/**
	 * 字段 startLink 获取函数
	 * @return the startLink : DTILink
	 */
	public DTILink getStartLink() {
		return startLink;
	}

	/**
	 * 字段 startLink 设置函数 : DTILink
	 * @param startLink the startLink to set
	 */
	public void setStartLink(DTILink startLink) {
		this.startLink = startLink;
	}


	/**
	 * 字段 startName 获取函数
	 * @return the startName : String
	 */
	public String getStartName() {
		return startName;
	}

	/**
	 * 字段 startName 设置函数 : String
	 * @param startName the startName to set
	 */
	public void setStartName(String startName) {
		this.startName = startName;
	}

	/**
	 * 字段 startDistance 获取函数
	 * @return the startDistance : int
	 */
	public int getStartDistance() {
		return startDistance;
	}

	/**
	 * 字段 startDistance 设置函数 : int
	 * @param startDistance the startDistance to set
	 */
	public void setStartDistance(int startDistance) {
		this.startDistance = startDistance;
	}
	/**
	 * 字段 endLink 获取函数
	 * @return the endLink : DTILink
	 */
	public DTILink getEndLink() {
		return endLink;
	}

	/**
	 * 字段 endLink 设置函数 : DTILink
	 * @param endLink the endLink to set
	 */
	public void setEndLink(DTILink endLink) {
		this.endLink = endLink;
	}

	/**
	 * 字段 endName 获取函数
	 * @return the endName : String
	 */
	public String getEndName() {
		return endName;
	}

	/**
	 * 字段 endName 设置函数 : String
	 * @param endName the endName to set
	 */
	public void setEndName(String endName) {
		this.endName = endName;
	}

	/**
	 * 字段 endDistance 获取函数
	 * @return the endDistance : int
	 */
	public int getEndDistance() {
		return endDistance;
	}

	/**
	 * 字段 endDistance 设置函数 : int
	 * @param endDistance the endDistance to set
	 */
	public void setEndDistance(int endDistance) {
		this.endDistance = endDistance;
	}

	/**
	 * 字段 passings 获取函数
	 * @return the passings : List<PassingRoad>
	 */
	public List<PassingRoad> getPassingRoads() {
		return passRoadList;
	}

	/**
	 * 字段 passings 设置函数 : PassingRoad
	 * @param passings the passings to set
	 */
	public void addPassRoad(PassingRoad passings) {
		this.passRoadList.add(passings);
	}

	/**
	 * 字段 lon 获取函数
	 * @return the lon : int
	 */
	public int getLon() {
		return lon;
	}

	/**
	 * 字段 lon 设置函数 : int
	 * @param lon the lon to set
	 */
	public void setLon(int lon) {
		this.lon = lon;
	}

	/**
	 * 字段 lat 获取函数
	 * @return the lat : int
	 */
	public int getLat() {
		return lat;
	}

	/**
	 * 字段 lat 设置函数 : int
	 * @param lat the lat to set
	 */
	public void setLat(int lat) {
		this.lat = lat;
	}

	public void sort() {
		if (this.getPassingRoads().size() > 1){
			Map<Integer, List<PassingRoad>> meshes = new HashMap<Integer, List<PassingRoad>>();
			for (int i = 0; i < this.getPassingRoads().size(); i++) {
				int rc = ( this.getPassingRoads().get(i)).getLink()
						.getRoadClass();
				if (meshes.containsKey(rc)) {
					meshes.get(rc).add(this.getPassingRoads().get(i));
				} else {
					meshes.put(rc, new ArrayList<PassingRoad>());
					meshes.get(rc).add(this.getPassingRoads().get(i));
				}
			}
			this.getPassingRoads().clear();
			for (Iterator<List<PassingRoad>> ii = meshes.values().iterator(); ii
					.hasNext();) {
				List<PassingRoad> result = ii.next();
				Collections.sort(result, new PassingRoadComparator());
				this.getPassingRoads().addAll(result);
			}
			meshes = null;
		} 
	}

}
